Skip to content

fix(composer): show project skills in menus - #7909

Open
t3-code[bot] wants to merge 19 commits into
mainfrom
fix/project-skills-menus
Open

fix(composer): show project skills in menus#7909
t3-code[bot] wants to merge 19 commits into
mainfrom
fix/project-skills-menus

Conversation

@t3-code

@t3-code t3-code Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

problem

the composer only had a machine-level provider snapshot, so project/worktree skills could be missing from / and $ even though the provider loaded them correctly when a session started from that cwd.

fix

  • keep the machine snapshot as the fallback before any project session starts
  • after a provider session starts, ask that provider instance to probe a new snapshot from the session cwd
  • cache the resulting skill and slash-command catalog by provider instance plus cwd
  • reuse the cached snapshot for other threads on the same cwd, while keeping worktrees isolated
  • update codex, claude, cursor, grok, and opencode drivers to support cwd-scoped snapshot probes
  • let web, desktop, and mobile select the matching workspace snapshot, falling back to the machine snapshot when none exists
  • keep workspace snapshots volatile and bounded instead of persisting them into the machine status cache

this removes the generic filesystem discovery rpc from the earlier version. provider adapters remain authoritative for discovery.

testing

  • 175 focused tests passed across contracts, client runtime, provider drivers/registry, orchestration, web, and mobile
  • live cwd skill probes passed with Codex CLI 0.149.0 and OpenCode 1.18.21 against a real project-local SKILL.md
  • targeted typechecks passed for contracts, client runtime, server, web, and mobile
  • targeted formatting and lint passed

ui

no layout changes. this changes the catalog backing the existing / and $ menus.

model: gpt-5.6-sol
harness: Hermes Agent

request provenance

Note

Show workspace-scoped project skills and slash commands in composer menus

  • Add workspaceSnapshots to ServerProvider schema in server.ts to hold per-cwd skills and slash commands.
  • Implement snapshotForCwd for Claude, Codex, and OpenCode drivers to probe and return skills for a specific directory.
  • Add refreshWorkspaceSnapshot to ProviderRegistry to asynchronously cache per-cwd snapshots, triggered by ProviderCommandReactor during session start.
  • Update web and mobile composers to resolve skills and slash commands for the active git cwd using resolveProviderSkillsForCwd, falling back to machine-level data if no snapshot exists.
  • Risk: ProviderRegistryLive.writeProviderStatusCache in ProviderRegistry.ts strips workspaceSnapshots before persisting to disk; workspace skills are re-probed on server restart rather than loaded from cache.

Macroscope summarized 429c5fe.


Note

Medium Risk
Touches provider registry caching, session-start probes, and composer catalogs. Workspace snapshots are volatile and cwd probes spawn extra provider processes, so races or failed probes can leave menus on machine-level skills.

Overview
Composer menus can now show project/worktree skills and slash commands, not only the machine-level provider snapshot.

After a provider session starts (or is reused), ProviderCommandReactor forks refreshWorkspaceSnapshot. Drivers (Claude, Codex, OpenCode) implement snapshotForCwd to probe only the cwd catalog, which the registry caches on ServerProvider.workspaceSnapshots (bounded, not persisted, cleared on instance rebuild, single-flighted). Clients resolve via resolveProviderSkillsForCwd / resolveProviderSlashCommandsForCwd in web and mobile composers and timelines.

Pending or missing cwd snapshots keep the machine catalog. OpenCode skill-only probes now fail visibly instead of returning an empty list.

Reviewed by Cursor Bugbot for commit 429c5fe. Bugbot is set up for automated code reviews on this repo. Configure here.

Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 22, 2026
Comment thread apps/mobile/src/features/threads/ThreadComposer.tsx Outdated
@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 13.4 KiB 13.4 KiB +3 B (+0.0%) 15.1 KiB
Codex Thread snapshot wire 6.9 KiB 6.9 KiB −1 B (−0.0%) 7.3 KiB
Codex Live turn WebSocket wire 6.5 KiB 6.6 KiB +4 B (+0.1%) 7.8 KiB
Codex Live turn WebSocket decoded 55.0 KiB 55.0 KiB 0 B (0.0%) 66.4 KiB
Codex Live turn messages 16 16 0 (0.0%) 21
Claude Total thread wire 13.4 KiB 13.4 KiB −3 B (−0.0%) 15.1 KiB
Claude Thread snapshot wire 6.9 KiB 6.9 KiB −3 B (−0.0%) 7.3 KiB
Claude Live turn WebSocket wire 6.6 KiB 6.6 KiB 0 B (0.0%) 7.8 KiB
Claude Live turn WebSocket decoded 55.8 KiB 55.8 KiB 0 B (0.0%) 66.4 KiB
Claude Live turn messages 16 16 0 (0.0%) 21

Baseline: b4be33f · PR result: 429c5fe · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the new slash-command branch of isComposerMenuLoading reaches an empty-state copy path in ComposerCommandMenu that only special-cases the skill trigger, so a pending project-skills query renders file-search copy in the / menu.

Posted via Macroscope — UI Consistency

Comment thread apps/web/src/components/chat/ChatComposer.tsx Outdated
Comment thread apps/mobile/src/features/threads/ThreadComposer.tsx
Comment thread apps/web/src/components/chat/ChatComposer.tsx Outdated
@macroscopeapp

macroscopeapp Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This XL PR introduces workspace-scoped provider discovery, new provider probes, registry caching/invalidation, and cross-platform menu/timeline behavior, with meaningful concurrency and external-process side effects. It also changes .macroscope/ configuration, so the scope requires human review.

You can add or adjust custom eligibility rules. Learn more.

t3-code Bot and others added 2 commits August 22, 2026 15:47
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
t3-code Bot and others added 2 commits August 23, 2026 07:39

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the composer's new cwd-scoped skill list is not mirrored by the timeline's skill chip renderer, so project-scoped skills render inconsistently between the composer and the sent message.

Posted via Macroscope — UI Consistency

Comment on lines +893 to +898
const selectedProviderSkills = selectedProviderStatus
? resolveProviderSkillsForCwd(selectedProviderStatus, gitCwd)
: [];
const selectedProviderSlashCommands = selectedProviderStatus
? resolveProviderSlashCommandsForCwd(selectedProviderStatus, gitCwd)
: [];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The composer now resolves skills from the workspace snapshot for gitCwd, but the timeline chip renderer still reads the machine snapshot: ChatView.tsx passes skills={activeProviderStatus?.skills ?? EMPTY_PROVIDER_SKILLS} (line 6660) into MessagesTimeline, and SkillInlineText drops any $name it cannot find in that list. A project-only skill picked here therefore shows as a chip in ComposerPromptEditor and then as raw $name text once the message is sent — the same token rendered two different ways in one view.

Suggest resolving the timeline list the same way, e.g. skills={activeProviderStatus ? resolveProviderSkillsForCwd(activeProviderStatus, gitCwd) : EMPTY_PROVIDER_SKILLS} in ChatView.tsx (gitCwd is already in scope there).

Posted via Macroscope — UI Consistency

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed in 48e7493: the sent-message timeline now resolves skills from the same cwd-scoped catalog as the composer.

Comment thread apps/server/src/orchestration/Layers/ProviderCommandReactor.ts Outdated
Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review: one finding on error construction in the new Codex snapshotForCwd wrapper. The rest of the change (provider-owned per-instance+cwd snapshot cache, machine snapshot preserved as fallback, registry dependency taken from the environment, driver snapshotForCwd SPI) matches the conventions.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/provider/Drivers/CodexDriver.ts Outdated
Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts
Comment thread apps/mobile/src/features/threads/ThreadComposer.tsx
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts Outdated
Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts Outdated
Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts Outdated
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the new ProviderRegistryLive.refreshWorkspaceSnapshot orchestration (per-instance+cwd cache dedupe, publish on change, stale-instance rejection, clearing cwd catalogs on instance rebuild) has no focused test. Everything else in the provider-scoped snapshot work looks consistent with the conventions — driver-owned snapshotForCwd probes, machine snapshot preserved as fallback, scoped data attached inside a single atomic Ref.modify, and workspaceSnapshots stripped from the on-disk cache.

Posted via Macroscope — Effect Service Conventions

return yield* Ref.get(providersRef);
});

const refreshWorkspaceSnapshot = Effect.fn("refreshWorkspaceSnapshot")(function* (input: {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is new backend behavior with several non-obvious invariants — dedupe by instanceId + cwd, publish only when the snapshot list actually changes, drop results from a stale ProviderInstance, and the rebuild path above (L597-L612) clearing workspaceSnapshots — but the only new registry test covers the pure upsertProviderWorkspaceSnapshot helper. Consider adding a focused ProviderRegistryLive test using the existing harness in ProviderRegistry.test.ts (fake ProviderInstance with snapshotForCwd) that asserts at least: a scoped probe is cached and published for one cwd without touching another cwd's menus or the machine snapshot, and an instance rebuild clears the cached cwd catalogs.

Posted via Macroscope — Effect Service Conventions

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed in 236bb1f: ProviderRegistryLive now has focused coverage for publish, cwd dedupe, machine snapshot preservation, and rebuild invalidation.

Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
t3-code Bot and others added 2 commits August 23, 2026 18:37
# Conflicts:
#	apps/web/src/components/chat/ChatComposer.tsx
#	packages/client-runtime/src/providerSkills.test.ts
#	packages/client-runtime/src/providerSkills.ts
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Comment thread apps/server/src/provider/Drivers/OpenCodeDriver.ts Outdated
Comment thread apps/server/src/provider/Drivers/CodexDriver.ts Outdated

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review: three findings, all on the new snapshotForCwd wiring for post-session cwd catalog refreshes.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/provider/Drivers/CursorDriver.ts Outdated
Comment thread apps/server/src/provider/Drivers/GrokDriver.ts Outdated
Comment thread apps/server/src/provider/Drivers/CodexDriver.ts
Comment thread apps/server/src/provider/Layers/CodexProvider.ts
Comment thread apps/server/src/provider/Drivers/CodexDriver.ts
Comment thread apps/server/src/provider/opencodeRuntime.ts
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the OpenCode cwd catalog refresh reuses the full provider/model/agent inventory probe instead of a skills-only query. Codex, Claude, and the registry/rebuild handling look consistent with the conventions, and the previously missing ProviderRegistryLive coverage for refreshWorkspaceSnapshot is now present.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/provider/Drivers/OpenCodeDriver.ts Outdated
Comment thread apps/server/src/provider/Drivers/OpenCodeDriver.ts
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Comment thread apps/server/src/provider/opencodeRuntime.ts Outdated
t3-code Bot and others added 2 commits August 23, 2026 20:18
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the Claude cwd catalog path; the Codex/OpenCode/registry items from earlier runs look addressed.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Comment thread apps/server/src/provider/Layers/ClaudeProvider.ts

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the new refreshWorkspaceSnapshot cache-admission rule. The narrow cwd probes (Codex skills/list, Claude capabilities+skills, OpenCode skills-only), the stale-instance rejection, the atomic Ref.modify, and the rebuild-clears-and-publishes path all look correct.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 78ba0cc. Configure here.

Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts Outdated
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
@github-actions github-actions Bot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 23, 2026

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the workspace-snapshot admission guard in ProviderRegistry.refreshWorkspaceSnapshot.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts Outdated
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL 500-999 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants